<template>
  <view class="w-picker-view">
    <picker-view class="d-picker-view" :indicator-style="itemHeight" :value="pickVal" @change="handlerChange">
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.hours" :key="index">{{ item }}时</view>
      </picker-view-column>
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.minutes" :key="index">{{ item }}分</view>
      </picker-view-column>
      <picker-view-column v-if="second">
        <view class="w-picker-item" v-for="(item, index) in range.seconds" :key="index">{{ item }}秒</view>
      </picker-view-column>
    </picker-view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      pickVal: [],
      range: {},
      checkObj: {},
    }
  },
  props: {
    itemHeight: {
      type: String,
      default: '44px',
    },
    value: {
      type: [String, Array, Number],
      default: '',
    },
    current: {
      //是否默认选中当前日期
      type: Boolean,
      default: false,
    },
    second: {
      type: Boolean,
      default: true,
    },
  },
  watch: {
    value(val) {
      this.initData()
    },
  },
  created() {
    this.initData()
  },
  methods: {
    formatNum(n) {
      return Number(n) < 10 ? '0' + Number(n) : Number(n) + ''
    },
    checkValue(value) {
      let strReg = /^\d{2}:\d{2}:\d{2}$/,
        example = '18:00:05'
      if (!strReg.test(value)) {
        console.log(new Error('请传入与mode、fields匹配的value值，例value=' + example + ''))
      }
      return strReg.test(value)
    },
    resetData(year, month, day, hour, minute) {
      let curDate = this.getCurrenDate()
      let curFlag = this.current
      let curHour = curDate.curHour
      let curMinute = curDate.curMinute
      let curSecond = curDate.curSecond
      for (let hour = 0; hour < 24; hour++) {
        hours.push(this.formatNum(hour))
      }
      for (let minute = 0; minute < 60; minute++) {
        minutes.push(this.formatNum(minute))
      }
      for (let second = 0; second < 60; second++) {
        seconds.push(this.formatNum(second))
      }
      return {
        hours,
        minutes,
        seconds,
      }
    },
    getData(curDate) {
      //用来处理初始化数据
      let hours = [],
        minutes = [],
        seconds = []
      let curFlag = this.current
      let disabledAfter = this.disabledAfter
      let fields = this.fields
      let curHour = curDate.curHour
      let curMinute = curDate.curMinute
      let curSecond = curDate.curSecond
      for (let hour = 0; hour < 24; hour++) {
        hours.push(this.formatNum(hour))
      }
      for (let minute = 0; minute < 60; minute++) {
        minutes.push(this.formatNum(minute))
      }
      for (let second = 0; second < 60; second++) {
        seconds.push(this.formatNum(second))
      }
      return this.second
        ? {
            hours,
            minutes,
            seconds,
          }
        : {
            hours,
            minutes,
          }
    },
    getCurrenDate() {
      let curDate = new Date()
      let curHour = curDate.getHours()
      let curMinute = curDate.getMinutes()
      let curSecond = curDate.getSeconds()
      return this.second
        ? {
            curHour,
            curMinute,
            curSecond,
          }
        : {
            curHour,
            curMinute,
          }
    },
    getDval() {
      let value = this.value
      let fields = this.fields
      let dVal = null
      let aDate = new Date()
      let hour = this.formatNum(aDate.getHours())
      let minute = this.formatNum(aDate.getMinutes())
      let second = this.formatNum(aDate.getSeconds())
      if (value) {
        let flag = this.checkValue(value)
        if (!flag) {
          dVal = [hour, minute, second]
        } else {
          dVal = value ? value.split(':') : []
        }
      } else {
        dVal = this.second ? [hour, minute, second] : [hour, minute]
      }
      return dVal
    },
    initData() {
      let curDate = this.getCurrenDate()
      let dateData = this.getData(curDate)
      let pickVal = [],
        obj = {},
        full = '',
        result = '',
        hour = '',
        minute = '',
        second = ''
      let dVal = this.getDval()
      let curFlag = this.current
      let disabledAfter = this.disabledAfter
      let hours = dateData.hours
      let minutes = dateData.minutes
      let seconds = dateData.seconds
      let defaultArr = this.second
        ? [
            dVal[0] && hours.indexOf(dVal[0]) != -1 ? hours.indexOf(dVal[0]) : 0,
            dVal[1] && minutes.indexOf(dVal[1]) != -1 ? minutes.indexOf(dVal[1]) : 0,
            dVal[2] && seconds.indexOf(dVal[2]) != -1 ? seconds.indexOf(dVal[2]) : 0,
          ]
        : [
            dVal[0] && hours.indexOf(dVal[0]) != -1 ? hours.indexOf(dVal[0]) : 0,
            dVal[1] && minutes.indexOf(dVal[1]) != -1 ? minutes.indexOf(dVal[1]) : 0,
          ]
      pickVal = disabledAfter
        ? defaultArr
        : curFlag
        ? this.second
          ? [
              hours.indexOf(this.formatNum(curDate.curHour)),
              minutes.indexOf(this.formatNum(curDate.curMinute)),
              seconds.indexOf(this.formatNum(curDate.curSecond)),
            ]
          : [hours.indexOf(this.formatNum(curDate.curHour)), minutes.indexOf(this.formatNum(curDate.curMinute))]
        : defaultArr
      this.range = dateData
      this.checkObj = obj
      hour = dVal[0] ? dVal[0] : hours[0]
      minute = dVal[1] ? dVal[1] : minutes[0]
      if (this.second) second = dVal[2] ? dVal[0] : seconds[0]
      result = this.second ? `${hour + ':' + minute + ':' + second}` : `${hour + ':' + minute}`
      full = this.second ? `${hour + ':' + minute + ':' + second}` : `${hour + ':' + minute + ':00'}`
      this.$nextTick(() => {
        this.pickVal = pickVal
      })
      this.$emit('change', {
        result: result,
        value: full,
        obj: obj,
      })
    },
    handlerChange(e) {
      let arr = [...e.detail.value]
      let data = this.range
      let hour = '',
        minute = '',
        second = '',
        result = '',
        full = '',
        obj = {}
      hour = arr[0] || arr[0] == 0 ? data.hours[arr[0]] || data.hours[data.hours.length - 1] : ''
      minute = arr[1] || arr[1] == 0 ? data.minutes[arr[1]] || data.minutes[data.minutes.length - 1] : ''
      if (this.second) second = arr[2] || arr[2] == 0 ? data.seconds[arr[2]] || data.seconds[data.seconds.length - 1] : ''
      obj = this.second
        ? {
            hour,
            minute,
            second,
          }
        : {
            hour,
            minute,
          }
      this.checkObj = obj
      result = this.second ? `${hour + ':' + minute + ':' + second}` : `${hour + ':' + minute}`
      full = this.second ? `${hour + ':' + minute + ':' + second}` : `${hour + ':' + minute + ':00'}`
      this.$emit('change', {
        result: result,
        value: full,
        obj: obj,
      })
    },
  },
}
</script>

<style lang="scss">
@import './w-picker.css';
</style>
